﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;

namespace GeneticAlgorithm
{
	class Chromosome
	{
		// 정수를 2진수로 변환
		// AL  : Hashtable에 저장할 변수
		// flag: BNWT 및 BNPF에 각각 나눌 변수
		// <Result>: 스트링 형태로 BNWT와 BNPF에 2진수 저장
		public static void ConvertBinary( Hashtable AL, int flag )
		{
			int		skey = 0;
			Int64	binaryHolder;
			char[]	binaryArray;
			IDictionaryEnumerator EM = AL.GetEnumerator();	// Number of ArrayList

			while ( EM.MoveNext() )
			{
				string binaryResult = "";
				int decimalNum = int.Parse( string.Format( "{0}", EM.Value ) );

				for ( int i = 0; i < Define.BTSZ; i++ )
				{
					if ( decimalNum > 0 )
					{
						binaryHolder = decimalNum % 2;
						binaryResult += binaryHolder;
						decimalNum = decimalNum / 2;
					}
					else
						binaryResult = binaryResult + "0";
				}

				binaryArray = binaryResult.ToCharArray();
				Array.Reverse( binaryArray );

				if ( flag == 1 )
					GA.BNWT.Add( skey, new string( binaryArray ) );
				else if ( flag == 2)
					GA.BNPF.Add( skey, new string( binaryArray ) );

				skey++;
			}
		}

		// 파일 DATA.CSV의 데이터 Hashtable에 저장
		// <Result>: ALWT, ALPF에 각각 저장
		public static void CreateGenomes()
		{
			int skey = 0;
			string	sTempFile	= ".\\data.csv";

			try
			{
				using ( StreamReader  sr = new StreamReader( sTempFile ) )
				{
					string	str;
					while ( ( str = sr.ReadLine() ) != null )
					{
						string[] word = str.Split( ',' );
						GA.ALWT.Add( skey, word[1] );
						GA.ALPF.Add( skey, word[2] );

						skey++;
					}
					sr.Close();
				}
			}
			catch ( Exception e )
			{
				// Let the user know what went wrong.
				Console.WriteLine( "The file could not be read:" );
				Console.WriteLine( e.Message );
			}

			Chromosome.ConvertBinary( GA.ALWT, 1 );
			Chromosome.ConvertBinary( GA.ALPF, 2 );

			System.Console.WriteLine( "Finish CreateGenomes()" );
		}
	}
}
